package com.example;

import org.junit.Test;

import java.util.*;

public class SetTest {

    @Test
    public void test01() {
        Set<Integer> set = new HashSet<>();
        set.add(1);
        set.add(2);
        set.add(5);
        set.add(3);
        set.add(3); // 舍弃
        System.out.println(set); // 1,2,3,5
    }

    @Test
    public void test02() {
        /* Set集合判断重复是根据泛型的hashCode方法以及equals方法 */
        Set<User> set = new HashSet<>();
        System.out.println(new User("张三", 20).hashCode()); // 1
        System.out.println(new User("张三", 20).hashCode()); // 2
        set.add(new User("张三", 20));
        set.add(new User("张三", 20));
        set.add(new User("张三", 20));
        System.out.println(set.size());
    }

    @Test
    public void test03() {
        /* LinkedHashSet是HashSet的子类，但可以保持存入元素的顺序 */
        Set<Integer> set = new LinkedHashSet<>();
        set.add(3);
        set.add(4);
        set.add(3); // 舍弃
        set.add(1);
        set.add(2);
        System.out.println(set);
        /* set集合建议使用增强for循环遍历，因为set集合没有索引 */
        for (Integer integer : set) {
            System.out.println(integer);
        }
    }

    @Test
    public void test04() throws InterruptedException {
        /* TreeSet集合存放的类型必须给定排序规则 */
//        Set<Integer> set = new TreeSet<>();
        Set<Book> set = new TreeSet<>();
        set.add(new Book("西游记", new Date())); // 就进行了比较
        Thread.sleep(3000);
        // 进行了比较，后加的对象调用compareTo比较之前的对象
        set.add(new Book("三国演义", new Date()));
        System.out.println(set);
        // 跟前一个对象比较
        set.add(new Book("水浒传", new Date(1000)));
        System.out.println(set);
    }

    /* 使用TreeSet集合放置用户对象，根据用户的年龄排序，如果年龄相同，再判断id */
    @Test
    public void test05() {
        Set<U> set = new TreeSet<>(); // 没有提供比较的方法
        U u1 = new U("张三", 20, 1);
        U u2 = new U("李四", 21, 2);
        U u3 = new U("王五", 19, 3);
        U u4 = new U("赵六", 19, 4);
//        System.out.println(u1.compareTo(u2));
//        System.out.println(u2.compareTo(u3));
        set.add(u1);
        set.add(u2); //
        set.add(u4); //
        set.add(u3); //
        System.out.println(set);
    }

    /* 使用TreeSet存放U类型的用户数据，根据id降序 */
    @Test
    public void test06() {
        Set<U> set = new TreeSet<>(); // 根据U类型当中的compareTo方法来比较
        /* 使用匿名内部类创建Comparator的对象 */
        Comparator<U> comparator = new Comparator<U>() {
            @Override
            public int compare(U o1, U o2) {
                return -o1.getId().compareTo(o2.getId());
            }
        };
        // 自定义比较器放入构造方法中
        Set<U> set1 = new TreeSet<>(comparator);
        U u1 = new U("张三", 20, 1);
        U u2 = new U("李四", 21, 2);
        U u3 = new U("王五", 19, 3);
        U u4 = new U("赵六", 19, 4);
        set1.add(u1);
        set1.add(u2);
        set1.add(u4);
        set1.add(u3);
        System.out.println(set1); // 4，3，2，1
    }
}
